import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Actor principal del juego. Puede disparar, moverse a todas las direcciones y es la clase que manejará el usuario
 * 
 * @author Luis Guajardo Olvera
 * @author Daniel Romero Martí
 */
public class StarFox extends Actor
{   
    private GreenfootImage [] arreglo;
    private int profundidad;
    private int tiempoDisparo;
    private boolean bandera;
    private int contDano;
    private Vida vida;
    private Puntos puntos;

    /**
     * Constructor de la clase StarFox
     */
    public StarFox()
    {  
        profundidad=9;
        arreglo = new GreenfootImage[5];
        for(int i=0;i<5;i++)
            arreglo[i] = new GreenfootImage("starfox"+i+".png");   // arreglo de movimientos de la nave  
        tiempoDisparo=2;
        vida = new Vida();
        puntos = new Puntos();
        bandera = true;
        contDano=0;

    }

    /**
     * Hace el llamado para disminuír la vida de la nave
     */
    public void disminuyeVida(int cant)
    {
        vida.disminuye(cant);
        contDano=1;
    }

    /**
     * Método para cargar la imagen inicial de la nave
     */
    public void addedToWorld(World Tierra)
    {
        setImage(arreglo[0]);
    }

    /**
     * Act - do whatever the StarFox wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act()
    { 
        if(bandera)
        {
            this.agregaVida();
            this.agregaPuntos();
        }

        this.mueve();
        if(tiempoDisparo>=10)
        {  if(Greenfoot.isKeyDown("space"))
            {  this.ataca();
                tiempoDisparo = 0; 
            }
        }
        else
            tiempoDisparo++;

        if(contDano==1)
            this.agregaDano();
        if(contDano!=0)
        {  contDano++;
            if(contDano==11)
            {  this.quitaDano();
                contDano = 0;
            }
        }

    } 

    /**
     * Método que agrega la vida al mundo
     */
    public void agregaVida()
    { 
        World mundo = getWorld();
        mundo.addObject(vida,59,383);
        bandera=false;
    }
    
    /**
     * Hace el llamado para guardar el puntaje del usuario
     */
    public void agregaRecords()
    {
        puntos.actualizaPuntos(regresaPuntos());
    }

    /**
     * Agrega los puntos al escenario
     */
    public void agregaPuntos()
    {
        World mundo = getWorld();
        mundo.addObject(puntos,39,16);
    }

    /**
     * Hace el llamado para incrementar el puntaje del usuario
     */
    public void aumentaPuntos(int unaCant)
    {
        puntos.incrementaPuntos(unaCant);
    }
    
    /**
     * Regresa el valor de la variable puntos
     */
    public int regresaPuntos()
    {
        return puntos.regresaPuntos();
    }

    /**
     * Método que regresa el valor de la variable profundidad
     */
    public int profundidad()
    {
        return profundidad;
    }

    /**
     * Método para mover la nave hacia todas las direcciones
     */
    public void mueve()
    {
        if(getY()>=210)
            setImage(arreglo[3]);
        else
            setImage(arreglo[0]);
        if(Greenfoot.isKeyDown("left") && getX()>=68)
        {
            setImage(arreglo[1]);
            move(-5);
        }
        if(Greenfoot.isKeyDown("right") && getX()<535)
        {
            setImage(arreglo[2]);
            move(5);
        }
        if(Greenfoot.isKeyDown("down") && getY()<=359)
        {
            if(getY()<210)
                setImage(arreglo[4]);
            setLocation(getX(),getY()+5);
        }
        if(Greenfoot.isKeyDown("up") && getY()>27)
        {
            setImage(arreglo[3]);
            setLocation(getX(),getY()-5);
        }
        escala();
    }

    /**
     * Método que verifica si la nave llegó hacia el suelo
     */

    public void escala()
    {
        GreenfootImage imagen = getImage();
        if(Greenfoot.isKeyDown("a"))
            imagen.scale(imagen.getWidth()*2,imagen.getHeight()*2);
        if(Greenfoot.isKeyDown("s"))
            imagen.scale(imagen.getWidth()/2,imagen.getHeight()/2);
        setImage(imagen);
    }

    /**
     * Crea objetos tipo Bala, para que StarFox los dispare
     */
    public void ataca()
    {   Bala bala;
        World mundo;
        int x,y;
        x=getX();
        y=getY();
        mundo = getWorld();

        if(y>=210)
        {
            if(y>=350)
            {
                bala= new Bala(3);
                mundo.addObject(bala,x-1,y-30);
            }
            else
            {
                bala= new Bala(1);
                mundo.addObject(bala,x-1,y-30);
            }
        }
        else
        {
            bala= new Bala(0);
            mundo.addObject(bala,x,y-9);
        }
        Greenfoot.playSound("disparo.wav");
    }

   
    /**
     * Método que agrega una imagen cuando starfox es inpactado por otro objeto
     */
    public void agregaDano()
    { 
        Dano daño = new Dano();
        World mundo = getWorld();
        mundo.addObject(daño,getX(),getY());
    }

    /**
     * Quita la imagen que se pone cuando es dañado starfox
     */
    public void quitaDano()
    { 
        int tam;
        World mundo = getWorld();
        java.util.List dano = mundo.getObjects(Dano.class);
        tam = dano.size();
        for(int i=0;i<tam;i++)
        {
            Dano d = (Dano)dano.get(i);
            mundo.removeObject(d);
        }
    }
}